// generator 生成器 -> 遍历器(需要有一个 next 方法) -> 数组 -> 类数组 长得像数组 ?
const likeArray = { 0: 'a', 1: 'b', 2: 'd', length: 3 };
// likeArray[Symbol.iterator] = function () {
//     let i = 0
//     return { // 就是一个对象 有 next 方法
//         next: () => {
//             return {
//                 value : this[i], 
//                 done  : i ++ === this.length
//             }
//         }
//     }
// }

// "元" 编程 自己改写js 原因的功能
// likeArray[Symbol.iterator] = function* () { // generator 函数可以生产遍历器
//     let i = 0
//     while(i !== this.length) {
//         yield this[i++]
//     }
// }

// 原理就是 遍历这个对象 将结果放到数组中  这个数据必须有一个遍历器 [...new Set()] for of
// [...likeArray]

// 对象强制转化成 数组
// 根据 length 属性生成 数组, 根据 key 生成
// Array.from(likeArray)
// console.log([...likeArray])

// 普通函数默认会从头到尾执行 没有暂停的功能
// generator 函数时 ES6 提供的语法  如果碰到 yield 就会 暂停执行  (redux-sage, koa1 中)
// function* read() {
//     yield 1
//     yield 2
//     yield 3
// }

// let iterator = read() // iterator 就是迭代器 迭代器有个 next 方法
// let flag = false
// do {
//     let { value, done } = iterator.next()
//     console.log(value)
//     flag = done
// } while (!flag);

// console.dir(iterator.next())
// console.dir(iterator.next())
// console.dir(iterator.next())
// console.dir(iterator.next())

// yield 是有返回值的

// function *read() {
//     // 不是 将 yield 的值返回给 a, 而是将 next中的 值传给a
//     let a = yield 1;
//     console.log(a)
//     let b = yield 2;
//     console.log(b)
//     let c = yield 3;
//     console.log(c)
//     return c
// }
// // 蛇形执行 出啦第一次之外的 next 方法  都是把next 中的参数传递给  上一次 yield 的结果
// let it = read()
// it.next() // 第一次的 next 传递参数没有任何意义
// it.next(1)
// it.next(2)

const fs = require('fs').promises
function* read() {
    try {
        let name = yield fs.readFile('./node/name.txt', 'utf8')
        let age = yield fs.readFile('./node/age.txt', 'utf8') // async - await
        return age
    } catch (error) {
        console.log(error)
    }
}

// 优化这段代码
let it = read()
let { value, done } = it.next()
value.then(data => {
    let { value, done } = it.next(data)
    value.then(data => {
        let { value, done } = it.next(data)
        console.log(data)
    })
})

// read().then(data => {
//     console.log(data)
// })